home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / lang / SmallEiffel.lha / SmallEiffel / lib_std / link_list.e < prev    next >
Text File  |  1998-12-22  |  3KB  |  142 lines

  1. -- This file is  free  software, which  comes  along  with  SmallEiffel. This
  2. -- software  is  distributed  in the hope that it will be useful, but WITHOUT 
  3. -- ANY  WARRANTY;  without  even  the  implied warranty of MERCHANTABILITY or
  4. -- FITNESS  FOR A PARTICULAR PURPOSE. You can modify it as you want, provided
  5. -- this header is kept unaltered, and a notification of the changes is added.
  6. -- You  are  allowed  to  redistribute  it and sell it, alone or as a part of 
  7. -- another product.
  8. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  9. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr 
  10. --                       http://www.loria.fr/SmallEiffel
  11. --
  12. class LINK_LIST[E]
  13.    -- 
  14.    -- One way linked list with internal automatic memorization of
  15.    -- the last access.
  16.    --
  17.  
  18. inherit LINKED_COLLECTION[E];
  19.  
  20. creation
  21.    make, from_collection
  22.  
  23. feature
  24.  
  25. feature -- Creation and Modification :
  26.    
  27.    make is
  28.       -- Make an empty list;
  29.       do
  30.      first_link := Void;
  31.      upper := 0;
  32.      last_link := Void;
  33.      mem_idx := 0;
  34.      mem_lnk := Void;
  35.       ensure
  36.      count = 0
  37.       end;
  38.  
  39. feature -- Implementation of deferred :
  40.  
  41.    add_first(element: like item) is
  42.       do
  43.      if first_link = Void then
  44.         !!first_link.make(element,Void);
  45.         upper := 1;
  46.         last_link := first_link;
  47.         mem_idx := 1;
  48.         mem_lnk := first_link;
  49.      else 
  50.         !!first_link.make(element,first_link);
  51.         upper := upper + 1;
  52.         mem_idx := mem_idx + 1;
  53.      end;
  54.       end;
  55.  
  56.    add_last(element: like item) is
  57.       local
  58.      lnk: like first_link;
  59.       do
  60.      if first_link = Void then
  61.         !!first_link.make(element,Void);
  62.         upper := 1;
  63.         last_link := first_link;
  64.         mem_idx := 1;
  65.         mem_lnk := first_link;
  66.      else
  67.         !!lnk.make(element,Void);
  68.         last_link.set_next(lnk);
  69.         upper := upper + 1;
  70.         last_link := lnk;
  71.      end;
  72.       end;
  73.    
  74.    add(element: like item; index: INTEGER) is
  75.       local
  76.      link: like first_link;
  77.       do
  78.      if index = 1 then
  79.         add_first(element);
  80.      elseif index = upper + 1 then
  81.         add_last(element);
  82.      else
  83.         if (index - 1) /= mem_idx then
  84.            go_item(index - 1);
  85.         end;
  86.         !!link.make(element,mem_lnk.next);
  87.         mem_lnk.set_next(link);
  88.         upper := upper + 1;
  89.      end;
  90.       end;
  91.  
  92.    remove_first is
  93.       do
  94.      if upper = 1 then
  95.         make;
  96.      else
  97.         mem_lnk := first_link;
  98.         first_link := first_link.next;
  99.         mem_lnk := first_link;
  100.         mem_idx := 1;
  101.         upper := upper - 1;
  102.      end;
  103.       end;
  104.  
  105.    remove(index: INTEGER) is
  106.       local
  107.      link: like first_link;
  108.       do
  109.      if index = 1 then
  110.         remove_first;
  111.      elseif index = upper then
  112.         remove_last;
  113.      else
  114.         if (index - 1) /= mem_idx then
  115.            go_item(index - 1);
  116.         end;
  117.         link := mem_lnk.next;
  118.         mem_lnk.set_next(link.next);
  119.         upper := upper - 1;
  120.      end;
  121.       end;
  122.  
  123. feature {NONE}
  124.  
  125.    go_item(i: INTEGER) is
  126.       do
  127.      if mem_idx > i then
  128.         mem_idx := 1;
  129.         mem_lnk := first_link;
  130.      end;
  131.      from
  132.      until
  133.         i = mem_idx
  134.      loop
  135.         mem_lnk := mem_lnk.next;
  136.         mem_idx := mem_idx + 1;
  137.      end;
  138.       end;
  139.  
  140. end -- LINK_LIST[E]
  141.  
  142.